home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / UTILITY1 / HK10.ZIP / HKSRC.ZIP / HK.C next >
C/C++ Source or Header  |  1993-07-12  |  35KB  |  1,064 lines

  1. //===========================================================
  2. // HK - A Hotkey program for Windows.
  3. // Copyright (C) 1993 Douglas Boling
  4. //
  5. // Revision History:
  6. //
  7. // 1.0   Initial Release
  8. //
  9. //===========================================================
  10. // Returns no. of elements
  11. #define dim(x) (sizeof(x) / sizeof(x[0]))   
  12.  
  13. #define MAXFNAMELEN       128
  14. #define MAXCMDLINELEN     256
  15. #define MAXKEYNAMELEN     40
  16. #define MAXHOTKEYS        64
  17.  
  18. #define ID_TIMER          1
  19. //
  20. // Undocumented things
  21. //
  22. #define WM_SETHOTKEY      0x32
  23. #define WM_GETHOTKEY      0x33
  24. //
  25. // Custom messages
  26. //
  27. #define MYMSG_HKWINRIP    WM_USER+10
  28. #define MYMSG_HKWINERR    WM_USER+11
  29.  
  30. #define MYMSG_ENABLEHK    WM_USER+1
  31. //-----------------------------------------------------------
  32. // Include files
  33. //-----------------------------------------------------------
  34. #include "windows.h"
  35. #include "commdlg.h"
  36. #include "stdlib.h"
  37. #include "string.h"
  38.  
  39. #include "HK.h"
  40.  
  41. //-----------------------------------------------------------
  42. // Global data
  43. //-----------------------------------------------------------
  44. // Message dispatch table for MainWindowProc
  45. struct decodeUINT MainMessages[] = {
  46.     WM_CREATE, DoCreateMain,
  47.     WM_COMMAND, DoCommandMain,
  48.     WM_TIMER, DoTimerMain,
  49.     WM_SIZE, DoSizeMain,
  50.     WM_CLOSE, DoCloseMain,
  51.     WM_DESTROY, DoDestroyMain,
  52.     MYMSG_HKWINRIP, DoHKWinRIPMain,
  53.     MYMSG_HKWINERR, DoHKWinErrMain,
  54. };
  55. // Command Message dispatch for MainWindowProc
  56. struct decodeCMD MainMenuItems[] = {
  57.     IDD_KEYLIST, DoMainCtlKeyList,
  58.     IDD_ADD, DoMainCtlAdd,
  59.     IDD_DEL, DoMainCtlDel,
  60.     IDD_EDIT, DoMainCtlEdit,
  61.     IDD_ABOUT, DoMainCtlAbout,
  62.     IDD_EXIT, DoMainCtlExit,
  63.     IDOK, DoMainCtlExit,
  64.     IDCANCEL, DoMainCtlExit,
  65. };
  66. HANDLE    hInst;
  67. HWND        hMain;
  68. UINT        wVersion = 10;
  69. INT         sTimerFreq;
  70.  
  71. char    szAppName[] = "WinHK";         // Application name
  72. char    szIconName[] = "WinHKIcon";    // Icon name
  73. char    szProfileName[] = "HK.ini";    // INI file name
  74. char    szHKWinClass[] = "HKChildWin";  // Child Window Class name
  75.  
  76. // Edit box subclass vars
  77. FARPROC lpfnEditSCProc, lpfnOldEditWndProc;
  78.  
  79. // Hotkey array vars   
  80. INT        sNumHKs = 0;
  81. INT        sNumRunning = 0;
  82. PHKENTRY    phkArray;
  83.  
  84. // Return values from Add dialog
  85. char szNewCL[MAXCMDLINELEN];
  86. UINT wAddKey;
  87. //============================================================
  88. // WinMain -- entry point for this application from Windows.
  89. //============================================================
  90. INT APIENTRY WinMain(HANDLE hInstance, HANDLE hPrevInstance, 
  91.                      LPSTR lpCmdLine, INT nCmdShow) {
  92.     MSG    msg;
  93.     INT    rc;
  94.  
  95.     hInst = hInstance;
  96.     // Only allow one instance of HK at a time
  97.    if(hPrevInstance)    return 1;
  98.     if((rc = InitApp(hInstance)) != 0)
  99.         return rc;
  100.     // Initialize this instance
  101.     if((rc = InitInstance(hInstance, lpCmdLine, nCmdShow)) != 0)
  102.         return rc;
  103.     //
  104.     // Application message loop
  105.     //
  106.     while (GetMessage (&msg, NULL, 0, 0)) {
  107.         if (!IsDialogMessage (hMain, &msg)) {
  108.             TranslateMessage(&msg);
  109.             DispatchMessage(&msg);
  110.         }    
  111.     }
  112.     // Instance cleanup
  113.     return TermInstance(hInstance, msg.wParam);
  114. }
  115.   
  116. //-----------------------------------------------------------
  117. // InitApp - Global initialization code for this application.
  118. //-----------------------------------------------------------
  119. INT InitApp(HANDLE hInstance) {
  120.     WNDCLASS     wc;
  121.     //
  122.     // Register App Main Window class
  123.     //
  124.     wc.style = 0;                             // Window style
  125.     wc.lpfnWndProc = MainWndProc;             // Callback function
  126.     wc.cbClsExtra = 0;                        // Extra class data
  127.     wc.cbWndExtra = DLGWINDOWEXTRA;           // Extra window data
  128.     wc.hInstance = hInstance;                 // Owner handle
  129.     wc.hIcon = LoadIcon(hInst, szIconName);   // Application icon
  130.     wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Default cursor
  131.     wc.hbrBackground = GetStockObject(LTGRAY_BRUSH); // Background color 
  132.     wc.lpszMenuName =  NULL;                  // Menu name
  133.     wc.lpszClassName = szAppName;             // Window class name
  134.  
  135.     if (RegisterClass(&wc) == 0)
  136.         return 1;
  137.     //
  138.     // Register App Child Window class
  139.     //
  140.     wc.style = 0;                             // Window style
  141.     wc.lpfnWndProc = HKChildWndProc;          // Callback function
  142.     wc.cbClsExtra = 0;                        // Extra class data
  143.     wc.cbWndExtra = sizeof (DWORD);           // Extra window data
  144.     wc.hInstance = hInstance;                 // Owner handle
  145.     wc.hIcon = NULL;                          // Application icon
  146.     wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Default cursor
  147.     wc.hbrBackground = GetStockObject(LTGRAY_BRUSH); // Background color 
  148.     wc.lpszMenuName =  NULL;                  // Menu name
  149.     wc.lpszClassName = szHKWinClass;          // Window class name
  150.  
  151.     if (RegisterClass(&wc) == 0)
  152.         return 2;
  153.     
  154.     return 0;
  155. }
  156. //-----------------------------------------------------------
  157. // InitInstance - Instance initialization code for this app.
  158. //-----------------------------------------------------------
  159. INT InitInstance(HANDLE hInstance, LPSTR lpCmdLine, INT nCmdShow) {
  160.    int    i,j;
  161.     PHKENTRY phkPtr;
  162.     char    szTemp[MAXCMDLINELEN+12];
  163.     char    *pszCmd;
  164.  
  165.     phkArray = (PHKENTRY) LocalAlloc (LPTR, sizeof (HKENTRY) * MAXHOTKEYS);
  166.     if (phkArray == 0)
  167.         return 11;
  168.     sTimerFreq = GetPrivateProfileInt (szAppName, PRO_TIMERFREQ, 
  169.                                        1000, szProfileName);
  170.     //
  171.     // Read hot key information from the INI file
  172.     //
  173.     j = GetPrivateProfileInt (szAppName, PRO_HKCNT, 0, szProfileName);
  174.     sNumHKs = 0;
  175.     phkPtr = phkArray;
  176.     for (i = 0; i < j; i++) {
  177.         itoa (i, szTemp, 10);
  178.         GetPrivateProfileString (PRO_HKLST, szTemp, "0,", szTemp, sizeof (szTemp),
  179.                                  szProfileName);
  180.         pszCmd = strchr (szTemp,',');
  181.         if (pszCmd != 0) {
  182.             *pszCmd++ = '\0';
  183.             phkPtr->wKey = atoi (szTemp);
  184.             strcpy (phkPtr->szCmdLine, pszCmd);
  185.             phkPtr++;
  186.             sNumHKs++;
  187.         }    
  188.     }    
  189.     i = GetPrivateProfileInt (szAppName, PRO_XPOS, 100,
  190.                               szProfileName);
  191.     j = GetPrivateProfileInt (szAppName, PRO_YPOS, 100,
  192.                               szProfileName);
  193.     // Create main window
  194.     hMain = CreateDialog (hInstance, szAppName, 0, NULL);
  195.     if(!hMain) return 0x10;
  196.  
  197.     SetWindowPos (hMain, NULL, i, j, 0, 0, SWP_NOSIZE);
  198.     ShowWindow(hMain, nCmdShow | SW_SHOW);
  199.     UpdateWindow(hMain);              // force WM_PAINT message
  200.     return 0;                         // return success flag
  201. }
  202. //------------------------------------------------------------
  203. // TermInstance - Instance termination code for this app.
  204. //------------------------------------------------------------
  205. INT TermInstance(HANDLE hinstance, int sDefRC) {
  206.  
  207.     return sDefRC;
  208. }
  209. //============================================================
  210. // Message handling procedures for MainWindow
  211. //============================================================
  212. //------------------------------------------------------------
  213. // MainWndProc - Callback function for application window
  214. //------------------------------------------------------------
  215. LONG CALLBACK MainWndProc(HWND hWnd, UINT wMsg, UINT wParam, 
  216.                           LONG lParam) {
  217.     INT i;
  218.     //
  219.     // Search message list to see if we need to handle this
  220.     // message.  If in list, call procedure.
  221.     //
  222.     for(i = 0; i < dim(MainMessages); i++) {
  223.         if(wMsg == MainMessages[i].Code)
  224.             return (*MainMessages[i].Fxn)(hWnd, wMsg, wParam, lParam);
  225.     }
  226.     return DefDlgProc(hWnd, wMsg, wParam, lParam);
  227. }
  228. //------------------------------------------------------------
  229. // DoCreateMain - process WM_CREATE message for frame window.
  230. //------------------------------------------------------------ 
  231. LONG DoCreateMain (HWND hWnd, UINT wMsg, UINT wParam, LONG lParam) {
  232.     INT    i;
  233.     PHKENTRY phkPtr;
  234.  
  235.     phkPtr = phkArray;
  236.     for (i = 0; i < sNumHKs; i++) {
  237.         CreateHKWindow (hWnd, phkPtr);
  238.         phkPtr++;
  239.     }
  240.     SetActiveWindow (hWnd);
  241.     return 0;
  242. }
  243. //------------------------------------------------------------
  244. // DoSizeMain - process WM_SIZE message for frame window.
  245. //------------------------------------------------------------ 
  246. LONG DoSizeMain (HWND hWnd, UINT wMsg, UINT wParam,